package com.shujia.spark.core

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo6ReduceByKey {
  def main(args: Array[String]): Unit = {

    //1、创建环境
    val conf = new SparkConf()
    //4:4核
    conf.setMaster("local")
    conf.setAppName("group")
    val sc = new SparkContext(conf)

    val linesRDD: RDD[String] = sc.textFile("data/students.txt")

    /**
     * 转换算子：懒执行：不会立马执行，需要操作算子触发执行
     * 数据是一条一条在整个代码逻辑中流动
     */
    //1、map：传入一行返回一行
    val studentsRDD: RDD[(String, Int)] = linesRDD
      .map(_.split(","))
      .map {
        case Array(_, _, _, _, clazz) => (clazz, 1)
      }

    studentsRDD
      .groupByKey()
      .mapValues(iter => iter.sum)
      .foreach(println)


    /**
     * reduceByKey
     * 1、对相同key的value进行聚合计算
     * 2、会在每一个map task中对相同key的value预聚合，可以减少shuffle过程中传输的数据量，提高效率
     * 3、只能处理相对简单的逻辑
     */
    studentsRDD
      .reduceByKey((x, y) => x + y)
      .foreach(println)

    while (true) {}


  }
}
